/**
 * 项目名：	Rumba Plan
 * 
 * 版权所有(C)，上海海鼎信息工程股份有限公司，2007，所有权利保留。
 * 
 * 文件名：	ProgressStack.java
 * 模块说明：	
 * 修改历史：
 * 2007-1-16 - lxm - 创建。
 */
package com.hd123.rumba.runtime.backprocess;

import java.util.Stack;

/**
 * 处理进度栈 | 实现类
 * <p>
 * 
 * 提供一个处理进度对象{@link Progress}的栈。
 * 
 * @see Progress
 * @author lxm
 * 
 */
public class ProgressStack {

  private Stack<Progress> stack;

  public ProgressStack() {
    super();
    stack = new Stack();
  }

  /**
   * 创建一个新的处理进度对象，并压栈。
   * 
   * @param parentStep
   *          换算上级步长，&gt;=0。参见{@link Progress#getParentStep()}。
   * @return 返回创建的处理进度对象。
   */
  public synchronized Progress pushNew(float parentStep) {
    Progress pgr = new Progress(this);
    pgr.setParentStep(parentStep);
    return stack.push(pgr);
  }

  /**
   * 出栈。
   * 
   * @return 返回被移出的处理进度对象。
   * @throws InterruptedException
   */
  public synchronized Progress pop() throws InterruptedException {
    Progress item = stack.pop();
    if (item != null)
      item.setPosition(item.getMaxValue());
    return item;
  }

  /**
   * 取得栈顶的处理进度对象。
   * 
   * @return 返回处理进度对象。
   */
  public Progress peek() {
    return stack.peek();
  }

  /**
   * 测试栈是否空。
   * 
   * @return true|false
   */
  public boolean empty() {
    return stack.empty();
  }

  /**
   * 取得指定的处理进度对象。
   * 
   * @param index
   *          指定的索引。
   * @return 返回取得的处理进度对象。
   */
  public Progress get(int index) {
    return stack.get(index);
  }

  /**
   * 取得栈的大小。
   * 
   * @return
   */
  public int size() {
    return stack.size();
  }

  /**
   * 清空栈。
   * 
   */
  public synchronized void clear() {
    stack.clear();
  }

  /**
   * 搜索给定参数的第一个匹配项，使用 equals 方法测试相等性。
   * 
   * @param item
   * @return 若找不到返回-1。
   */
  public int indexOf(Progress item) {
    return stack.indexOf(item);
  }

}
